<?php
namespace app\api\controller;


use app\api\service\PayService;
use app\user\model\UserModel;
use think\Controller;
use think\Db;
//支付宝支付类
vendor('alipay.wappay.service.AlipayTradeService');
vendor('alipay.wappay.buildermodel.AlipayTradeWapPayContentBuilder');
vendor('alipay.wappay.buildermodel.AlipayTradeRefundContentBuilder');
vendor('alipay.wappay.buildermodel.AlipayTradeFastpayRefundQueryContentBuilder');

//微信支付类
vendor('wxpay.WxPayConfig');
vendor('wxpay.WxPayApi');
vendor('wxpay.Notify');
vendor('wxpay.JsApi');



header("Content-type: text/html; charset=utf-8");
header("Access-Control-Allow-Origin:*");
class PayController extends Controller {


    /*
     * 支付宝网站支付
     */
    public function aliPay(){
        $payService = new PayService();
        $order_id=$this->request->param('order_id/s');
        $data=$payService->getOrderDataToId($order_id);
        if($data === false || empty($data)){
            $this->redirect('/');
        }
        //商户订单号，商户网站订单系统中唯一订单号，必填
        $out_trade_no = $data['order_id'];

        //订单名称，必填
        $subject = $data['goods_name'];

        //付款金额，必填
        $total_amount = number_format($data['pay_money'],2);

        //商品描述，可空
        $body = $data['goods_name'];

        //超时时间
        $timeout_express="1m";


        $payRequestBuilder=new \AlipayTradeWapPayContentBuilder();

        $payRequestBuilder->setBody($body);
        $payRequestBuilder->setSubject($subject);
        $payRequestBuilder->setOutTradeNo($out_trade_no);
        $payRequestBuilder->setTotalAmount($total_amount);
        $payRequestBuilder->setTimeExpress($timeout_express);

        $config = config('alipay_config');

        $payResponse = new \AlipayTradeService($config);

        $result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);
        return ;

    }
    /*
     * 支付宝异步通知
     */
    public function aliPayAuthRedirect(){
        $arr=$_POST;
        $config = config('alipay_config');
        $alipaySevice = new \AlipayTradeService($config);
        //日志
        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        //根据原商户订单号获取订单

        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //交易状态
            $trade_status = $arr['trade_status'];
            $payService = new PayService();
            //订单是否存在
            $order_data=$payService->getOrderDataToId($arr['out_trade_no']);
            if($order_data == false){
                //验证失败
                echo "fail";
                die;
            }
            //支付金额是否正确
            if(number_format($order_data['pay_money'],2) != $arr['total_amount']){
                //验证失败
                echo "fail";
                die;
            }
            //验证UID 是否正确
            if($arr['seller_id'] != $config['app_uid']){
                //验证失败
                echo "fail";
                die;
            }
            if($arr['app_id'] != $config['app_id']){
                //验证失败
                echo "fail";
                die;
            }




            if($trade_status == 'TRADE_FINISHED') {
                //不可退款通知


                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
            }
            else if ($trade_status == 'TRADE_SUCCESS') {
                if($order_data['pay_status'] == 0){
                    //订单支付成功
                    $insert_arr=[
                        'order_id'      => $arr['out_trade_no'],
                        'trade_no'      => $arr['trade_no'],          //支付宝交易凭证
                        'buyer_id'      => $arr['buyer_id'],         //买家支付宝唯一用户号
                        'receipt_amount'=> $arr['receipt_amount'],  //实收金额
                        'type'=> 3
                    ];
                    Db::name('order_pay_log')->insert($insert_arr);
                    $res=$payService->orderPaySuccess($order_data['order_id'],['pay_time'=>time()]);
                    if($res){
                        //支付状态修改成功并且未发货再进行订单处理
                        //开启事务
                        Db::startTrans();

                        //订单处理
                        $res=$payService->orderDataDispose($order_data['order_id']);
                        if($res !== false){
                            Db::commit();
                        }
                        Db::rollback();
                        echo "success";		//请不要修改或删除
                        die;
                    }

                }
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
            echo "fail";

        }else {
            //验证失败
            echo "fail";	//请不要修改或删除

        }


    }

    /*
     *  微信支付异步通知
     */
    public function wxNotifyUrl(){
        //获取通知的数据
        $xml = file_get_contents('php://input');
        //存入日志
        $jsApi=new \JsApiPay();

        //如果返回成功则验证签名
        try {
            $result = \WxPayResults::Init($xml);
            $jsApi->writeLog(var_export($result,true));

            if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
                //$jsApi->writeLog('验签成功并成功返回');
                $payService = new PayService();
                $data=$payService->getOrderDataToId($result['out_trade_no']);
                if($data){
                    //$jsApi->writeLog('获取到订单信息');
                    //金额验证
                    if(($result['total_fee']/100) == $data['pay_money']){
                        //$jsApi->writeLog('订单验证成功');
                        //订单支付成功
                        $insert_arr=[
                            'order_id'      => $result['out_trade_no'],
                            'trade_no'      => $result['trade_no'],          //微信订单号
                            'buyer_id'      => $result['buyer_id'],         //买家openid
                            'receipt_amount'=> $result['receipt_amount'],  //实收金额
                            'type'=> 2
                        ];
                        Db::name('order_pay_log')->insert($insert_arr);

                        $up=$payService->orderPaySuccess($result['out_trade_no'],['pay_time'=>time()]);
                        if($up){
                            //开启事务
                            Db::startTrans();
                            //$jsApi->writeLog('订单支付成功');
                            //支付状态修改成功并且未发货再进行订单处理
                            //订单处理
                            $res=$payService->orderDataDispose($result['out_trade_no']);
                            if($res !== false){
                                $jsApi->writeLog('订单处理成功');
                                Db::commit();
                            }else{
                                $jsApi->writeLog('订单处理失败');
                                Db::rollback();
                            }
                        }
                        echo exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');

                    }else if($data['pay_status'] == 1){
                        $jsApi->writeLog('订单处理成功,但又推送了');
                        echo exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
                    }
                }
            }
            echo exit('<xml><return_code><![CDATA[FAIL]]></return_code></xml>');

        } catch (\WxPayException $e){
            $msg = $e->errorMessage();
            $jsApi->writeLog('验证失败=>' . $msg);
            echo exit('<xml><return_code><![CDATA[FAIL]]></return_code></xml>');
        }
    }



}